# # SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件以及附带的邮件
# # Python对SMTP支持有smptlib和email两个模块,email负责构造邮件,smtplib负责发送邮件
# # 首先,我们来构造一个最简单的纯文本邮件:
# from email.mime.text import MIMEText
# msg = MIMEText('hello', 'send by Python...', 'plain', 'utf-8')
# # 注意到构造MIMEText对象时,第一个参数就是邮件的正文,第二个参数是MINE的subtype,传入'plain'表示纯文本，最终的MIME就是'text/plain'，最后一定要用utf-8编码保证多语言兼容性。
# # 然后,通过SMTP发出去:
#
# # 输入Email地址和口令
# from_addr = input('From: ***********@qq.com')
# password = input('Password: *******')
# #收入收件人地址:
# to_addr = input('To: **********@qq.com')
# # 输入SMTP服务地址:
# smtp_server = input('SMTP server: ')
#
# import smtplib
# server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口 25
# server.set_debuglevel(1)
# server.login(from_addr, password)
# server.sendmail(from_addr, [to_addr], msg.as_string())
# server.quit()
# # 我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。
# # SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器，sendmail()方法就是发邮件，由于可以一次发给多个人，所以传入一个list，邮件正文是一个str，as_string()把MIMEText对象变成str。


# 邮件没有主题；
# 收件人的名字没有显示为友好的名字，比如Mr Green <green@example.com>；
# 明明收到了邮件，却提示不在收件人中。
# 这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA，而是包含在发给MTA的文本中的，所以，我们必须把From、To和Subject添加到MIMEText中，才是一封完整的邮件：


# from email import encoders
# from email.header import Header
# from email.mime.base import MIMEBase
# from email.mime.multipart import MIMEMultipart
# from email.mime.text import MIMEText
# from email.utils import parseaddr, formataddr
# import smtplib
#
#
# # 格式化邮箱地址
# def _format_addr(s):
#     name, addr = parseaddr(s)
#     return formataddr((Header(name, 'utf-8').encode(), addr))
#
#
# # from_addr = input('From: ')
# from_addr = '*********@qq.com'
# # password = input('Password: ')
# password = '*********'
# # to_addr = input('To: ')
# to_addr = '*********@qq.com'
# # smtp_server = input('SMTP server: ')
# smtp_server = 'smtp.qq.com'
# # smtp.qq.com
# # 授权码 **********
# print("开始发送邮件......")
# msg = MIMEText('hello, send by Python...', ' plain', 'utf-8')
# msg['From'] = _format_addr('python 爱好者<%s>' % from_addr)
# msg['To'] = _format_addr('管理员<%s>' % to_addr)
# msg['Subject'] = Header('来自SMTP的问候.............', 'utf-8').encode()
#
# server = smtplib.SMTP(smtp_server, 25)
# server.set_debuglevel(1)
# server.login(from_addr, password)
# server.sendmail(from_addr, [to_addr], msg.as_string())
# server.quit()
# # 我们编写一个函数_format_addr()来格式化一个邮箱地址，注意不能简单的传入name<addr@example.com>, 因为如果包含中文，需要通过Header对象进行编码
# # msg['To'] 接收的是字符串而不是list,如果有多个邮件地址，用，分隔即可。
# # 再发一遍邮寄，就可以在邮箱中看到正确的标题了


# 要把图片嵌入到邮件正文中，我们只需按照发送附件的方式，先把邮件作为附件添加进去，然后，在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片，给它们依次编号，然后引用不同的cid:x即可。
# 实现
# 发送附件
# 如果Email中要加上附件怎么办？带附件的邮件可以看做包含若干部分的邮件：文本和各个附件本身，所以，可以构造一个MIMEMultipart对象代表邮件本身，然后往里面加上一个MIMEText作为邮件正文，再继续往里面加上表示附件的MIMEBase对象即可：
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

# 发送的账号
receivers = ['*******@qq.com', '*********@qq.com', '*********@gmail.com']

# 格式化邮箱地址
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
# 发送者的邮箱
# from_addr = input('From: ')
from_addr = '********'

# SMTP的服务码，可以登录上邮箱查看
# password = input('Password: ')
password = '*********'
# to_addr = ''
# 选择的邮箱
smtp_server = input('SMTP server: ')
smtp_server = '*********'

print('开始发送')
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % ','.join(receivers))
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase，从本地读取一个图片:
with open('f:/photo/*****.jpg', 'rb') as f:
    # 设置附件的MIME和文件名，这里是png类型:
    mime = MIMEBase('image', 'jpg', filename='********.jpg')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='********.jpg')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)


    # 添加到MIMEMultipart:
    # msg.attach(mime)
    # 把上面代码加入MIMEMultipart的MIMEText从plain改为html，然后在适当的位置引用图片：
    # 利用MIMEMultipart就可以组合一个HTML和Plain，要注意指定subtype是alternative：
    msg.attach(mime)
    # 正常发送msg对象
    msg.attach(MIMEText('hello', 'plain', 'utf-8'))
    # msg.attach(MIMEText('<html><body><h1>Hello</h1>' +
    #                     '<p><img src="cid:0"></p>' +
    #                     '</body></html>', 'html', 'utf-8'))


    print("发送完毕")

# 服务
# Gmail的SMTP端口是587
# 不同的邮箱端口不一样
#接收邮件服务器：imap.qq.com，使用SSL，端口号993
# 发送邮件服务器：smtp.qq.com，使用SSL，端口号465或587

server = smtplib.SMTP(smtp_server, 587)


# 加密SMTP
server.starttls()


server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, receivers, msg.as_string())
server.quit()


